package com.my.cd.template;

/**
 * 模版模式主类：热饮抽象类
 */
public abstract class HotDrink {

    /**
     * 准备热饮的模板方法
     */
    public final void prepareRecipe() {
        boilWater();//烧水，相同过程，基类实现
        brew();//冲泡，不同过程，子类实现
        pourInCup();//导入杯子，相同过程，基类实现

        if (wantCondimentsHook()) {
            addCondiments();//添加调料，不同过程，子类实现
        } else {
            System.out.println("No Condiments!");
        }
    }

    /**
     * 提供是否添加调料的钩子，用来给子类调用
     */
    protected boolean wantCondimentsHook() {
        return true;
    }

    protected abstract void brew();

    protected abstract void addCondiments();


    protected void boilWater() {
        System.out.println("water boil");
    }

    protected void pourInCup() {
        System.out.println("pouring into cup");
    }

}
